//
// Created by MikeChen on 2025/3/28.
//  C语言关系运算符


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Man {
    int age;
};

int main() {
    /*
        1.算数运算符：
        2.关系运算符：
            返回值是 真(1)假(0)
            > 大于 >=大于等于
            < 小于 <=小于等于
            ==等于 !=不等于
        3.逻辑运算符：
            (&&,||,!) 与，或，非
            1.与：有假则为假
                真 && 真 = 真
                真 && 假 = 假
                假 && 真 = 假
                假 && 假 = 假
            2.或：有真则为真
                真 || 真 = 真
                真 || 假 = 真
                假 || 真 = 真
                假 || 假 = 假
            3.非：
                !真 = 假
                !假 = 真
     */

    int a = 50, b = 100;
    printf("%d\n", a < b);//1
    printf("%d\n", a == b);//0
    printf("%d\n", a != b);//1
    int c = 1000;
    printf("关系运算符：%d\n", !1);//0

    a = 22, b = 33;
    printf("逻辑运算符：%d && %d = %d\n", a, b, a && b);//1
    a = 0;
    printf("逻辑运算符：%d && %d = %d\n", a, b, a && b);//0
    b = 0;
    printf("逻辑运算符：%d && %d = %d\n", a, b, a && b);//0

    /*
        赋值运算符:
            （=及其扩展赋值运算符：+=，-=，*=，/=，%=）
        条件运算符:
            (?:)(表达式1)?(表达式2):(表达式3) 三目运算符
        位运算符：
            (二进制位)：（左移<<，右移>>，按位非~，按位或|，按位异或^，按位与&）
        逗号运算符：
            起到分割参数的作用
        指针运算符：
            (*,&) *解引用 &取首地址
        求字节数运算符：
            sizeof()
        强制类型转换符：
            (类型名)(变量名/表达式)
        成员引用符：
            .点操作符 -> 指向操作符
        下标运算符：
            [] int a[5]; 下标从0开始
        其他运算符：
            函数调用() 复合语句{} 等

    */
    //赋值运算符
    a = 10, b = 5;
    a += b;//a=a+b
    printf("+=:%d\n", a);
    a = 10, b = 5;
    a -= b;//a=a-b
    printf("-=:%d\n", a);
    a = 10, b = 5;
    a *= b;//a=a*b
    printf("*=:%d\n", a);
    a = 10, b = 5;
    a /= b;//a=a/b
    printf("/=:%d\n", a);
    a = 10, b = 5;
    a %= b;//a=a%b
    printf("%%=:%d\n", a);
    //条件：三目
    a = 10, b = 5;
    printf("Max:%d\n", a > b ? a : b);//Max:10
    //位运算符
    a = 10, b = 5;
    a = a << 2;//1010左移两位101000，即10->40
    b = b >> 2;//0101右移两位01,即5->1
    printf("a=%d\n", a);//40
    printf("b=%d\n", b);//1
    b = ~b;
    /*
        0000 0000 0000 0000 0000 0000 0000 0001 取反
        1111 1111 1111 1111 1111 1111 1111 1110 该结果为原码
        根据符号位判定位负数，则其实际值为，负（原码取反+1的值）
            1111 1111 1111 1111 1111 1111 1111 1110 原码
            1000 0000 0000 0000 0000 0000 0000 0001 反码
            1000 0000 0000 0000 0000 0000 0000 0010 补码：反码+1
    */
    printf("b=%d\n", b);//-2
    a = a | b;
    printf("a=%d\n", a);//-2
    a = 10, b = 5;
    printf("a^b=%d\n", a ^ b);//15

    //逗号运算符
    a = (1, 6);
    printf("a=%d\n", a);//6
    int d;
    a = 5, b = 10, c = 20, d = 0;
    d = (a = c, a * b);
    printf("d=%d\n", d);//200

    a = 5, b = 10, c = 20, d = 0;
    d = (a = c, a * d);
    printf("d=%d\n", d);//0

    //指针运算符

    //求字节运算符

    //强制类型转换符

    //成员引用符
    struct Man m1;//Man结构体在main之前声明了
    m1.age = 50;
    printf("m.age:%d\n", m1.age);

    struct Man *m2 = (struct Man *) malloc(sizeof(struct Man));//动态分配空间
    m2->age = 18;
    printf("m->age:%d\n", m2->age);
    system("read -rsp $'Press enter to continue...\\n'");
    return EXIT_SUCCESS;
}

